﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Grafos;

namespace GrafosTestUnit {
    /// <summary>
    /// Testes na classe Passeio
    /// </summary>
    [TestClass]
    public class TestePasseio {

        /// <summary>
        /// Testa a adição e busca de vértices
        /// </summary>
        /// <remarks>
        /// Processo:
        /// Cria um grafo G com os vértices v1, v2, v3, v4
        /// Adiciona as arestas v1-v2, v1-v3, v3-v4 e v2-v4 a G
        /// Cria um novo passeio P
        /// Adiciona os vértices v1, v2, v4, v3, v1 a P
        /// Verifica-se:
        /// P é um ciclo
        /// O último vértice de P é v1
        /// P possui 5 vértices
        /// </remarks>
        [TestMethod]
        public void ProcurarVértices() {
            Grafo g;
            Passeio p;

            g = new Grafo();
            g.AdicionarVértice("v1", "v2", "v3", "v4");
            g.AdicionarAresta("v1", "v2");
            g.AdicionarAresta("v1", "v3");
            g.AdicionarAresta("v3", "v4");
            g.AdicionarAresta("v2", "v4");

            p = new Passeio();
            p.AdicionarVértice(g.BuscarVértice("v1"));
            p.AdicionarVértice(g.BuscarVértice("v2"));
            p.AdicionarVértice(g.BuscarVértice("v4"));
            p.AdicionarVértice(g.BuscarVértice("v3"));
            p.AdicionarVértice(g.BuscarVértice("v1"));

            Assert.IsTrue(p.Ciclo);
            Assert.AreEqual(g.BuscarVértice("v1"), p.ÚltimoVértice);
            Assert.AreEqual(5, p.QuantidadeVértices);
        }

        /// <summary>
        /// Testa o método de torção do passeio
        /// </summary>
        [TestMethod]
        public void Torção() {
            Grafo g;
            Passeio p;
            Vértice[] v;

            g = new Grafo();
            g.AdicionarVértice("v1", "v2", "v3", "v4");
            g.AdicionarAresta("v1", "v2");
            g.AdicionarAresta("v1", "v3");
            g.AdicionarAresta("v3", "v4");
            g.AdicionarAresta("v2", "v4");

            p = new Passeio();
            p.AdicionarVértice(g.BuscarVértice("v1"));
            p.AdicionarVértice(g.BuscarVértice("v2"));
            p.AdicionarVértice(g.BuscarVértice("v4"));
            p.AdicionarVértice(g.BuscarVértice("v3"));
            p.AdicionarVértice(g.BuscarVértice("v1"));

            p.Torcer(1, 4);

            Assert.IsFalse(p.Ciclo);
            v = p.Listar();

            Assert.AreEqual(v[0], g.BuscarVértice("v1"));
            Assert.AreEqual(v[1], g.BuscarVértice("v1"));
            Assert.AreEqual(v[2], g.BuscarVértice("v3"));
            Assert.AreEqual(v[3], g.BuscarVértice("v4"));
            Assert.AreEqual(v[4], g.BuscarVértice("v2"));
        }

        /// <summary>
        /// Testa o cálculo de valor do passeio
        /// </summary>
        /// <remarks>
        /// Processo:
        /// Cria o grafo G com vértices v1, v2, v3, v4
        /// Adiciona a G as arestas v1-v2(10), v2-v3(5), v2-v4(7)
        /// Cria o caminho P como: v1, v2, v3, v2, v4
        /// Verifica-se que o valor de P é 27
        /// </remarks>
        [TestMethod]
        public void Valor() {
            GrafoPonderado g;
            Passeio p;

            g = new GrafoPonderado();
            g.AdicionarVértice("v1", "v2", "v3", "v4");
            g.AdicionarAresta("v1", "v2", 10);
            g.AdicionarAresta("v2", "v3", 5);
            g.AdicionarAresta("v2", "v4", 7);

            p = new Passeio();
            p.AdicionarVértice(g, "v1", "v2", "v3", "v2", "v4");

            Assert.AreEqual(27, p.Valor());
        }
    }
}
